{# Default values which will be used if no actual configura available #}
{% set default_cable = '40m' %}
{% set mgmt_port_name = ['Ethernet256','Ethernet257'] %}

{# Port configuration to cable length look-up table #}
{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #}
{# Roles described in the minigraph #}
{% set ports2cable = {
        'torrouter_server'       : '5m',
        'leafrouter_torrouter'   : '40m',
        'spinerouter_leafrouter' : '300m'
        }
%}

{%- macro cable_length(port_name) %}
    {%- set cable_len = [] %}
    {%- for local_port in DEVICE_NEIGHBOR %}
        {%- if local_port == port_name %}
            {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %}
                {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %}
                {%- set neighbor_role = neighbor.type %}
                {%- set roles1 = switch_role + '_' + neighbor_role %}
                {%- set roles2 = neighbor_role + '_' + switch_role %}
                {%- set roles1 = roles1 | lower %}
                {%- set roles2 = roles2 | lower %}
                {%- if roles1 in ports2cable %}
                    {%- if cable_len.append(ports2cable[roles1]) %}{% endif %}
                {%- elif roles2 in ports2cable %}
                    {%- if cable_len.append(ports2cable[roles2]) %}{% endif %}
                {%- endif %}
            {%- endif %}
        {%- endif %}
    {%- endfor %}
    {%- if cable_len -%}
        {{ cable_len.0 }}
    {%- else %}
        {%- if switch_role.lower() == 'torrouter' %}
            {%- for local_port in VLAN_MEMBER %}
                {%- if local_port[1] == port_name %}
                    {%- set roles3 = switch_role + '_' + 'server' %}
                    {%- set roles3 = roles3 | lower %}
                    {%- if roles3 in ports2cable %}
                        {%- if cable_len.append(ports2cable[roles3]) %}{% endif %}
                    {%- endif %}
                {%- endif %}
            {%- endfor %}
            {%- if cable_len -%}
                {{ cable_len.0 }}
            {%- else -%}
                {{ default_cable }}
            {%- endif %}
        {%- else -%}
            {{ default_cable }}
        {%- endif %}
    {%- endif %}
{%- endmacro %}

{%- if DEVICE_METADATA is defined %}
{%- set switch_role = DEVICE_METADATA['localhost']['type'] %}
{%- endif -%}

{% set port_names_list = [] %}
{% for port in PORT %}
    {% if port not in mgmt_port_name %}
        {%- if port_names_list.append(port) %}{% endif %}
    {% endif %}
{% endfor %}
{% set port_names = port_names_list | join(',') -%}

{
    "CABLE_LENGTH": {
        "AZURE": {
    {% for port in PORT %}
        {% if port not in mgmt_port_name %}
            {% set cable = cable_length(port) -%}
            "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %}
        {% endif %}
    {% endfor %}
    }
    },
    "BUFFER_POOL": {
        "ingress_lossless_pool": {
            "size": "51691264",
            "type": "ingress",
            "mode": "dynamic",
            "xoff": "17708800"
        },
        "lossy_pool": {
            "size": "18874368",
            "type": "egress",
            "mode": "dynamic",
            "xoff": "0"
        },
        "egress_lossless_pool": {
            "size": "70565632",
            "type": "egress",
            "mode": "static"
        }
    },
    "BUFFER_PROFILE": {
        "ingress_lossless_profile": {
            "pool":"ingress_lossless_pool",
            "xoff":"38816",
            "size":"1518",
            "dynamic_th":"1",
            "xon_offset":"9408"
        },
        "egress_lossless_profile": {
            "pool":"ingress_lossless_pool",
            "size":"0",
            "static_th":"10243072"
        },
        "ingress_lossy_profile": {
            "pool":"lossy_pool",
            "size":"0",
            "static_th":"10243072"
        },
        "egress_lossy_profile": {
            "pool":"lossy_pool",
            "size":"1518",
            "dynamic_th":"2"
        }
    },
    "BUFFER_PG": {
{% for port in port_names_list %}
                "{{ port }}|3-4": {
                     {% set cable = cable_length(port) -%}
                     "profile" : "pg_lossless_400000_{{ cable }}_profile"
                },
{% endfor %}
{% for port in port_names_list %}
                "{{ port }}|0": {
                    "profile" : "ingress_lossy_profile"
                },
{% endfor %}
{% for port in port_names_list %}
                "{{ port }}|1-2": {
                    "profile" : "ingress_lossy_profile"
                },
{% endfor %}
{% for port in port_names_list %}
                "{{ port }}|5-7": {
                    "profile" : "ingress_lossy_profile"
                }{% if not loop.last %},{% endif %}

{% endfor %}
    },

    "BUFFER_QUEUE": {
{% for port in port_names_list %}
        "{{ port }}|3-4": {
             "profile" : "egress_lossless_profile"
        },
{% endfor %}
{% for port in port_names_list %}
        "{{ port }}|0-2": {
            "profile" : "egress_lossy_profile"
        },
{% endfor %}
{% for port in port_names_list %}
        "{{ port }}|5-7": {
            "profile" : "egress_lossy_profile"
        }{% if not loop.last %},{% endif %}

{% endfor %}
    }
}
